/******************************************
 * Métodos Numéricos - TP1 "Mandelzoom"
 *
 * mandelzoom.h
 * Declaración de la clase Mandel que barre el plano complejo generando imágenes del conjunto de Mandelbrot
 *
 ******************************************/
 
#ifndef __MANDELZOOM__
#define __MANDELZOOM__

#include <fstream>
#include <sstream>
#include "bigfloat.h"

using namespace std;

class Mandel {
public:
    /** Constructor */
    Mandel();

    /** Destructor */
    ~Mandel();

    /**
     * Grafica una imagen del conjunto de Mandelbrot en el archivo especificado.
     * Usa el tipo BigFloat, que debe estar definido como una etiqueta.
     *
     * Recibe como parámetros:
     *      path:           path del archivo de salida.
     *      x0, y0:         coordenadas lógicas desde donde se empezará a graficar.
     *      xScale, yScale: valores de tipo BigFloat que especifican la escala,
     *          interpretados como el ancho lógico de cada píxel; deben ser mayores a 0.
     *      xRes, yRes:     valores de tipo int que indican la cantidad de pixeles que
     *          que se graficarán; deben ser mayores a 0.
     *
     * Para cada par (xPx, yPx) tales que 0 <= xPx < xRes y 0 <= yPx < yRes, se dibujará
     * un píxel que reflejará la divergencia con respecto a la serie de Mandelbrot del par
     * de tipo BigFloat (x0 + xPx * xScale, y0 + yPx * yScale).
     *
     * Retorna true si y sólo si no se pudo abrir el archivo.
     */
    bool generar(const char* path,
                BigFloat x0, BigFloat y0,
                BigFloat xScale, BigFloat yScale,
                int xRes, int yRes, int maxIteraciones,
                int precis);

private:

    /**** Funciones para output ****/

    /**
     * Debe inicializar la escritura.
     * Devuelve false si y sólo si se pudo abrir el archivo correctamente.
     */
    bool initFile(int xRes, int yRes);

    /**
     * Dibuja un mandelvalor. Es -1 si converge o i>=0 si diverge en i iteraciones.
     */
    void dibujar(int mandelvalor);

    /**
     * Llamado luego de graficar una fila.
     */
    void endLine();

    /**
     * Llamado cuando se termino de graficar el archivo.
     */
    void finishFile();

    /**
     * Escribe un long en el archivo en formato little endian de 4 bytes.
     */
    void writeLittle(long a);

    ofstream* file;

    /** Datos auxiliares para bmp. */
    int padding;

    int numFilas;
    int filaActual;

    string path;

    /** Datos auxiliares para buffered bmp. */
    int fileSize;
    ostringstream* buffer;
    int byteCounter;

};


#endif
